package de.herzog.bbp.view;

import static de.herzog.bbp.view.SpielBeanConverter.DATE_CONVERTER;
import static de.herzog.bbp.view.SpielBeanConverter.HALLE_CONVERTER;
import static de.herzog.bbp.view.SpielBeanConverter.KLASSE_CONVERTER;
import static de.herzog.bbp.view.SpielBeanConverter.MANNSCHAFT_CONVERTER;
import static de.herzog.bbp.view.SpielBeanConverter.STRING_CONVERTER;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import de.herzog.bbp.model.Halle;
import de.herzog.bbp.model.Klasse;
import de.herzog.bbp.model.Mannschaft;
import de.herzog.bbp.model.Verein;
import de.herzog.bbp.model.dao.HalleDAO;
import de.herzog.bbp.model.dao.KlasseDAO;
import de.herzog.bbp.model.dao.MannschaftDAO;
import de.herzog.bbp.view.bean.SpielBean;
import de.herzog.bbp.view.javafx.AutoCompleteListFactory;

public abstract class SpielBeanAutoCompleter {

	public static final AutoCompleteListFactory<SpielBean, Klasse> KLASSE_LIST = new AutoCompleteListFactory<SpielBean, Klasse>(
			KLASSE_CONVERTER::toString) {
		@Override
		protected List<Klasse> getObjectList() {
			return sort(KlasseDAO.loadAll());
		}
	};

	public static final AutoCompleteListFactory<SpielBean, Date> DATE_LIST = new AutoCompleteListFactory<SpielBean, Date>(
			DATE_CONVERTER::toString) {
		@Override
		protected List<Date> getObjectList() {
			List<Date> list = new ArrayList<Date>();
			Date datum = getRowBean().getDatum();
			if (datum != null) {
				Calendar cal = Calendar.getInstance();
				cal.setTime(datum);
				cal.add(Calendar.DAY_OF_MONTH, -8);
				for (int i = 0; i < 90; i++) {
					int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
					if (dayOfWeek == Calendar.SATURDAY || dayOfWeek == Calendar.SUNDAY) {
						list.add(cal.getTime());
					}
					cal.add(Calendar.DAY_OF_MONTH, 1);
				}
			}
			return list;
		}
	};

	public static final AutoCompleteListFactory<SpielBean, String> ZEIT_LIST = new AutoCompleteListFactory<SpielBean, String>(
			STRING_CONVERTER::toString) {
		@Override
		protected List<String> getObjectList() {
			List<String> list = new ArrayList<String>();
			String[] stunden = { "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20" };
			String[] minuten = { "00", "15", "30", "45" };
			for (String stunde : stunden) {
				for (String minute : minuten) {
					list.add(stunde + ":" + minute);
				}
			}
			return list;
		}
	};

	public static final AutoCompleteListFactory<SpielBean, Mannschaft> MANNSCHAFT_LIST = new AutoCompleteListFactory<SpielBean, Mannschaft>(
			MANNSCHAFT_CONVERTER::toString) {
		@Override
		protected List<Mannschaft> getObjectList() {
			String klasse = getRowBean().getKlasse();
			return sort(MannschaftDAO.loadByKlasse(klasse));
		}
	};

	public static final AutoCompleteListFactory<SpielBean, Halle> HALLE_LIST = new AutoCompleteListFactory<SpielBean, Halle>(
			HALLE_CONVERTER::toString) {
		@Override
		protected List<Halle> getObjectList() {
			Verein heimVerein = getRowBean().heimProperty().get().getVerein();
			return sort(HalleDAO.loadByVerein(heimVerein));
		}
	};
}
